﻿using System.Collections.Generic;
using GigaSite.Domain.Entities;

namespace GigaSite.Domain.Interfaces.Repositories
{
    /// <summary>
    /// Абстрактный репозиторий пользователей
    /// </summary>
    public interface IUsersRepository: IBaseRepository<User>
    {
        /// <summary>
        /// Получает пользователя по уникальному идентификатору-логину
        /// </summary>
        /// <param name="identity">Идентити</param>
        /// <returns>Пользователь или null если его не найдено</returns>
        User GetUserByIdentity(string identity);

        /// <summary>
        /// Извлекает из базы пользователя с указанным логином и хешем
        /// </summary>
        /// <param name="identity">Логин</param>
        /// <param name="password">Хеш пароля</param>
        /// <returns>Пользователь</returns>
        User GetUserByIdentityAndPasswordHash(string identity, string password);

        /// <summary>
        /// Получает всех заблокированных пользователей
        /// </summary>
        /// <returns>Коллекция заблокированных пользователей</returns>
        IEnumerable<User> GetBlockedUsers();

        /// <summary>
        /// Регистрирует пользователя по его данным из социальных сетей
        /// </summary>
        /// <param name="json">Содержащий сведения, пришедшие от логинзы</param>
        /// <returns>Новый пользователь</returns>
        User RegisterUser(string json);

        /// <summary>
        /// Регистрирует нового пользователя с указанным логином и паролем
        /// </summary>
        /// <param name="userName">Имя пользователя</param>
        /// <param name="email">Email пользователя</param>
        /// <param name="password">Пароль</param>
        /// <returns>Созданный пользователя</returns>
        User RegisterUser(string userName, string email, string password);

        /// <summary>
        /// Обновляет данные пользователя на основе информации из социальных сетей
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="json">Данные о пользователе в json формате</param>
        void UpdateUserSocialData(User user, string json);
    }
}